import type {
  ActionConfig,
  BatchActionConfig,
  FormConfig,
  PageConfig,
  PageTemplateProps,
  SearchConfig,
  TableConfig,
} from './types';

/**
 * 页面模板配置构建器
 * 提供链式调用的方式来构建页面配置
 */
export class PageTemplateConfigBuilder<T = any> {
  private config: PageTemplateProps<T> = {
    tableConfig: { columns: [] }, // 必需的默认值
  };

  /**
   * 设置页面配置
   */
  setPageConfig(config: PageConfig) {
    this.config.pageConfig = config;
    return this;
  }

  /**
   * 设置搜索配置
   */
  setSearchConfig(config: SearchConfig) {
    this.config.searchConfig = config;
    return this;
  }

  /**
   * 设置表格配置
   */
  setTableConfig(config: TableConfig<T>) {
    this.config.tableConfig = config;
    return this;
  }

  /**
   * 设置表单配置
   */
  setFormConfig(config: FormConfig) {
    this.config.formConfig = config;
    return this;
  }

  /**
   * 设置操作配置
   */
  setActionConfig(config: ActionConfig<T>) {
    this.config.actionConfig = config;
    return this;
  }

  /**
   * 设置批量操作配置
   */
  setBatchActionConfig(config: BatchActionConfig<T>) {
    this.config.batchActionConfig = config;
    return this;
  }

  /**
   * 设置 CRUD 配置
   */
  setCrudConfig(config: any) {
    this.config.crudConfig = config;
    return this;
  }

  /**
   * 构建最终配置
   */
  build(): PageTemplateProps<T> {
    return { ...this.config };
  }
}

/**
 * 快速创建配置的工厂函数
 */
export const createPageTemplateConfig = <T = any>() => {
  return new PageTemplateConfigBuilder<T>();
};

/**
 * 预设配置模板
 */
export const configPresets = {
  /**
   * 基础CRUD页面配置
   */
  basicCrud: <T = any>() =>
    createPageTemplateConfig<T>()
      .setActionConfig({
        permissions: {
          create: true,
          update: true,
          delete: true,
          view: true,
        },
      })
      .setBatchActionConfig({
        enabled: true,
      }),

  /**
   * 只读列表页面配置
   */
  readOnlyList: <T = any>() =>
    createPageTemplateConfig<T>()
      .setActionConfig({
        permissions: {
          view: true,
        },
      }),

  /**
   * 带搜索的列表页面配置
   */
  searchableList: <T = any>() =>
    createPageTemplateConfig<T>()
      .setActionConfig({
        permissions: {
          create: true,
          update: true,
          delete: true,
          view: true,
        },
      })
      .setBatchActionConfig({
        enabled: true,
      }),
};